package com.itlong.cloud.app.dao;

import com.itlong.cloud.POJO.PO.ProjectPO;
import com.itlong.cloud.POJO.VO.app.AppDistinctProjectVO;
import com.itlong.cloud.POJO.VO.app.AppGetProjectUiVO;
import com.itlong.cloud.POJO.VO.app.AppMessageBoxVO;
import com.itlong.cloud.POJO.VO.property.PropertyProjectBuildSimpleInfoVO;
import com.itlong.cloud.POJO.VO.property.PropertyProjectRoomSimpleInfoVO;
import com.itlong.cloud.POJO.VO.property.PropertyProjectUnitSimpleInfoVO;
import com.itlong.cloud.abstracts.IAbstractBaseDao;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Repository;

import java.util.List;
import java.util.Map;

/**
 * <desc>
 *     APP端项目信息数据访问接口
 * </desc>
 * @createDate 2017-09-29
 */
@Mapper
@Repository
public interface IAppProjectDao extends IAbstractBaseDao<ProjectPO>{

    /**
     * <desc>
     *      根据城市名称获取城市id
     * </desc>
     *
     * @param cityName
     * @return
     * @author Jiaqi.X
     * @createDate 2020/05/28
     */
    String getCityIdByCityName(@Param("cityName") String cityName);

    /**
     * <desc>
     *      根据区ID获取启用状态的项目信息（项目编号与项目名称）
     * </desc>
     *
     * @param params 查询参数
     * @return  分页数据集
     * @author cuiduanwu
     * @createDate 2017/09/29
     */
    List<Map<String,Object>> getProjectsInCity(Map<String,Object> params);

    /**
     * <desc>
     *     app2.0根据城市ID获取启用状态的项目信息（项目编号与项目名称）
     * </desc>
     *
     * @param cityId 城市ID
     * @return
     * @author Qiang.S
     * @throws Exception
     * @createDate 2019/06/20
     */
    List<Map<String,Object>> getNewProjectsInCity(String cityId);

    /**
     * <desc>
     *     app2.0根据楼栋编号获取单元和房间
     * </desc>
     *
     * @param buildId 楼栋编号
     * @return
     * @author Qiang.S
     * @throws Exception
     * @createDate 2019/06/20
     */
    List<Map<String,Object>> getNewProjectsUnit(String buildId);

     /**
      * <desc>
      *       根据国家ID获取启用状态的项目信息（项目编号与项目名称）。
      * <desc/>
      *
      * @param  params
      * @return
      * @author shengen.T
      * @createDate 2018-01-03
      */
     List<Map<String,Object>> getProjectsInCountry(Map<String,Object> params);

    /**
     * <desc>
     *      根据项目ID获取启用状态的楼栋信息
     * </desc>
     *
     * @param params 查询参数
     * @return  分页数据集
     * @author cuiduanwu
     * @createDate 2017/09/29
     */
    List<PropertyProjectBuildSimpleInfoVO> getBuildsInProject(Map<String,Object> params);
    /**
     * <desc>
     *      根据楼栋ID获取启用状态的单元信息
     * </desc>
     *
     * @param params 查询参数
     * @return  分页数据集
     * @author cuiduanwu
     * @createDate 2017/09/29
     */
    List<PropertyProjectUnitSimpleInfoVO> getUnitsInBuild(Map<String,Object> params);
    /**
     * <desc>
     *      根据单元ID获取启用状态的房间信息
     * </desc>
     *
     * @param params 查询参数
     * @return  分页数据集
     * @author cuiduanwu
     * @createDate 2017/09/29
     */
    List<PropertyProjectRoomSimpleInfoVO> getRoomInUnit(Map<String,Object> params);

    /**
     * <desc>
     *      根据用户id获取该用户id下所有项目id集合
     * </desc>
     * @param userId 用户id
     * @return
     */
    List<String> getUserProjectIds(String userId);

    /**
     * <desc>
     *      设置APP是否被呼叫
     * </desc>
     * @param userId 用户id
     * @param isAllowApp app是否允许被呼叫 0是 1否
     * @return
     */
    Integer setAllowApp(@Param("userId")String userId,
                        @Param("isAllowApp")Integer isAllowApp,
                        @Param("projectId")String projectId);

    /**
     * <desc>
     *      设置电话是否被呼叫
     * </desc>
     *
     * @param projectId 项目id
     * @param userId 用户id
     * @param isAllowPhone 是否允许被呼叫 0是 1否
     * @return
     */
    Integer setAllowPhone(@Param("projectId") String projectId,
                          @Param("userId") String userId,
                          @Param("isAllowPhone") String isAllowPhone);

    /**
     * <desc>
     *      设置app登录用户当前项目id
     * </desc>
     *
     * @param userId 用户id
     * @param projectId 项目id
     * @return
     * @author Jiaqi.X
     * @createDate 2017/11/28
     */
    Integer setCurrentProject(@Param("userId") String userId,
                              @Param("projectId") String projectId,
                              @Param("projectName") String projectName);


    /**
     * <desc>
     *      根据用户id获取该用户id下所有项目id集合 包括被禁用的
     * </desc>
     *
     * @param userId 用户id
     * @return
     * @author Jiaqi.X
     * @createDate 2017/12/21
     */
    List<String> getUserAllProjectsId(@Param("userId") String userId);

    /**
     * <desc>
     *      获取当前用户下所有项目的UI信息
     * </desc>
     *
     * @param projectIds 多个项目编号id，中间以逗号隔开
     * @return
     * @author JuGuang.S
     * @createDate 2018/05/24
     */
    List<AppGetProjectUiVO> getProjectIdUi(@Param("projectIds") String[] projectIds, @Param("deviceType") String deviceType);

    /**
     * <desc>
     *      获取用户当前项目下的推送消息未读记录数
     * </desc>
     *
     * @return 当前项目下的推送消息未读记录数
     * @createDate 2019/05/30
     * @author wangzhi
     */
    Integer getMsgCount(Map<String, Object> params);

    /**
     * <desc>
     *      获取用户当前项目下的推送消息
     * </desc>
     *
     * @return 当前项目下的推送消息
     * @createDate 2019/05/30
     * @author wangzhi
     */
    List<AppMessageBoxVO> getMsgPage(Map<String, Object> params);

    /**
     * <desc>
     *      用户读取新消息
     * </desc>
     *
     * @param msgId 消息id
     * @return 1读取成功，0失败
     * @createDate 2019/05/30
     * @author wangzhi
     */
    Integer readNewMsg(@Param("msgId") String msgId);

    /**
     * <desc>
     *      用户读取新消息(小区通知和系统消息)
     * </desc>
     *
     * @param msgId 消息id
     * @return 1读取成功，0失败
     * @author wangzhi
     * @createDate 2019/06/20
     */
    Integer readPushMsg(@Param("msgId") String msgId, @Param("userId") String userId);

    /**
     * <desc>
     *      查询未读小区通知条数
     * </desc>
     *
     * @param params 查询参数
     * @return 未读小区通知条数
     * @author wangzhi
     * @createDate 2019/06/20
     */
    Integer getPropertyPushCount(Map<String, Object> params);

    /**
     * <desc>
     *      查询未读系统消息条数
     * </desc>
     *
     * @param params 查询参数
     * @return 未读系统消息条数
     * @author wangzhi
     * @createDate 2019/06/20
     */
    Integer getSysCount(Map<String, Object> params);

    /**
     * <desc>
     *      查询小区通知
     * </desc>
     *
     * @param params 查询参数
     * @return 小区通知
     * @author wangzhi
     * @createDate 2019/06/20
     */
    List<AppMessageBoxVO> getPropertyPushPage(Map<String, Object> params);

    /**
     * <desc>
     *      查询系统消息
     * </desc>
     *
     * @param params 查询参数
     * @return 系统消息
     * @author wangzhi
     * @createDate 2019/06/20
     */
    List<AppMessageBoxVO> getSysPage(Map<String, Object> params);

    /**
     * <desc>
     *      删除用户读取新消息记录(小区通知和系统消息)
     * </desc>
     *
     * @param msgId 消息id
     * @return 1成功，0失败
     * @author wangzhi
     * @createDate 2019/06/21
     */
    Integer deleteUserRead(@Param("msgId") String msgId, @Param("userId") String userId);

    /**
     * <desc>
     *      查询权限标识
     * </desc>
     *
     * @return 权限标识
     * @author wangzhi
     * @createDate 2019/10/08
     */
    String getNaturalFloor(@Param("deviceUnique") String deviceUnique, @Param("logicalFloor") String loadDeviceOrder);

    /**
     * <desc>
     *      查询用户常用楼层
     * </desc>
     *
     * @return 用户常用楼层
     * @author wangzhi
     * @createDate 2019/10/08
     */
    String getCommonFloor(@Param("userId") String userId, @Param("projectId") String projectId);

    
    
    /**
    *<desc>
    * 查询用户常用公共楼层
    *</desc>
    *
    * @Author  chengshican
    * @Date   2020-11-18 16:31
    * @Param  用户常用公共楼层
    * @Return      
    * @Exception   
    * 
    */
    String getPublicFloor(@Param("userId") String userId, @Param("projectId") String projectId);


    /**
     * <desc>
     *      更新用户项目信息中常用楼层信息
     * </desc>
     *
     * @return 受影响行数
     * @author wangzhi
     * @createDate 2019/10/08
     */
    Integer updateCommonFloor(@Param("userId") String userId, @Param("projectId") String projectId, @Param("commonFloor") String commonFloor);

    
    /**
    *<desc>
    * 更新用户项目信息中常用公共楼层信息
    *</desc>
    *
    * @Author  chengshican
    * @Date   2020-11-18 16:38
    * @Param   受影响行数
    * @Return      
    * @Exception   
    * 
    */
    Integer updatePublicFloor(@Param("userId") String userId, @Param("projectId") String projectId, @Param("publicFloor") String publicFloor);



    /**
     * <desc>
     *      获取用户项目定位信息
     * </desc>
     *
     * @return 用户项目定位信息
     * @author wangzhi
     * @createDate 2019/10/11
     */
    List<Map<String,Object>> getUserProjectPosition(@Param("userId") String userId);

    /**
     * <desc>
     *      查询当前用户在指定项目上是否存在迁入的房间
     * </desc>
     * @return
     * @author cuiduanwu
     * @createDate 2018/1/19
     */
    Integer countUserRoomInProject(Map<String,Object> map);

    /**
     * <desc>
     *     查询当前用户在指定项目上是否存在电梯权限
     * </desc>
     * @return
     * @author cuiduanwu
     * @createDate 2018/1/19
     */
    Integer countUserAuthInFloor(Map<String,Object> map);

    /**
     * <desc>
     *     查询当前用户在指定项目上是否存在门禁权限
     * </desc>
     * @return
     * @author cuiduanwu
     * @createDate 2018/1/19
     */
    Integer countUserAuthInDoor(Map<String,Object> map);

    /**
     * <desc>
     *     查询当前用户在指定项目上是否存在云对讲
     * </desc>
     * @return
     * @author cuiduanwu
     * @createDate 2018/1/19
     */
    Integer countUserAuthInCloudDoor(Map<String,Object> map);

    /**
     * <desc>
     *      查询未读小区通知条数运营+物业
     * </desc>
     *
     * @param params 查询参数
     * @return 未读小区通知条数运营+物业
     * @author JuGuang.S
     * @createDate 2018/09/17
     */
    Integer getPropertyAndOperatePushCount(Map<String, Object> params);

    /**
     * <desc>
     *      查询小区通知运营+物业
     * </desc>
     *
     * @param params 查询参数
     * @return 小区通知运营+物业
     * @author JuGuang.S
     * @createDate 2018/09/17
     */
    List<AppMessageBoxVO> getPropertyAndOperatePushPage(Map<String, Object> params);

    /**
     * <desc>
<<<<<<< HEAD:service/service-project/src/main/java/com/itlong/cloud/app/dao/IAppProjectDao.java
     *      获取用户当前项目下的推送消息总记录数
     * </desc>
     *
     * @return 当前项目下的推送消息总记录数
     * @author wangzhi
     * @createDate 2019/12/20
     */
    Integer getAllPayCount(Map<String, Object> params);

    /**
     * <desc>
     *      查询小区通知总记录数
     * </desc>
     *
     * @param params 查询参数
     * @return 小区通知总记录数
     * @author wangzhi
     * @createDate 2019/12/20
     */
    Integer getAllPropertyPushCount(Map<String, Object> params);

    /**
     * <desc>
     *      查询系统消息总记录数
     * </desc>
     *
     * @param params 查询参数
     * @return 系统消息总记录数
     * @author wangzhi
     * @createDate 2019/12/20
     */
    Integer getAllSysPushCount(Map<String, Object> params);

    /**
     * <desc>
     *      查询小区通知运营+物业总记录数
     * </desc>
     *
     * @param params 查询参数
     * @return 小区通知运营+物业总记录数
     * @author wangzhi
     * @createDate 2019/12/20
     */
    Integer getAllPropertyAndOperatePushCount(Map<String, Object> params);

    /**
     * <desc>
     *      检测项目蓝牙进场呼梯是否开启
     * </desc>
     *
     * @param projectId
     * @return
     * @author Jiaqi.X
     * @createDate 2020/04/27
     */
    Integer checkProjectBlueToothCall(@Param("projectId") String projectId);

    /**
     * <desc>
     *      获取完善定位开启游客的项目信息
     * </desc>
     *
     * @return 完善定位开启游客的项目信息
     * @author wangzhi
     * @createDate 2020/04/30
     */
    List<Map<String, Object>> getAllProjectHasPositionAndGuest();


    /**
    *<desc>
    * 根据群控器机号查询所绑定的电梯
    *</desc>
    *
    * @Author  chengshican
    * @Date   2020-11-18 17:50
    * @Param
    * @Return
    * @Exception
    *
    */
    List<String> getByControllerDeviceUnique(@Param("controllerDeviceUnique") String controllerDeviceUnique);


    
    
    /**
    *<desc>
    * 根据电梯获取所绑定的群控器
    *</desc>
    *
    * @Author  chengshican
    * @Date   2020-11-18 17:54
    * @Param  
    * @Return      
    * @Exception   
    * 
    */
    String getControllerByElevator(@Param("deviceUnique") String deviceUnique);
    /**
     * <desc>
     *      获取项目远程开门配置
     * </desc>
     *
     * @param projectId
     * @return
     * @author Juguang.S
     * @createDate 2020/09/17
     */
    Integer getNetworkOpenSetting(@Param("projectId") String projectId);

    /**
     * <desc>
     *      获取地址子节点
     * </desc>
     *
     * @param
     * @return
     * @Author Zhu.yj
     * @createDate  2021/4/6
     */
    List<AppDistinctProjectVO> getChilds(@Param("cityId") String cityId);

    /**
     * <desc>
     *      保存
     * <desc/>
     *
     * @param params 保存信息
     * @return sql执行行数
     * @author Juguang.S
     * @createDate 2019-12-24
     */
    Integer save(Map<String, Object> params);

    /**
     * <desc>
     *      通过项目名称模糊查询项目信息
     * </desc>
     *
     * @param projectName
     * @return
     * @Author Zhu.yj
     * @createDate  2021/4/6
     */
    List<Map<String, Object>> getProjectByProjectName(@Param("projectName") String projectName);

    /**
     * <desc>
     *      获取用户已认证的房间数量
     * </desc>
     *
     * @param params 查询参数
     * @return 用户已认证的房间数量
     * @Author Zhu.yj
     * @createDate  2021/4/7
     */
    Integer getUserRoomCount(Map<String, Object> params);

    /**
     * <desc>
     *      校验用户是否有该项目
     * </desc>
     *
     * @param params
     * @return
     * @Author Zhu.yj
     * @createDate  2021/4/8
     */
    Integer getUserProjectCount(Map<String, Object> params);

    /**
     * <desc>
     *      获取用户所有设备权限
     * </desc>
     *
     * @param params 查询参数
     * @return 用户已有权限数量（数量不准确，这里只为区分是否有权限）
     * @Author Zhu.yj
     * @createDate  2021/4/7
     */
    Integer getUserDeviceAuthCount(Map<String, Object> params);

    /**
     * <desc>
     *      删除用户项目
     * </desc>
     *
     * @param params 删除条件
     * @return
     * @Author Zhu.yj
     * @createDate  2021/4/7
     */
    Integer deleteUserProject(Map<String, Object> params);

    /**
     * <desc>
     *      获取项目下的用户类型id和用户类型名称
     * </desc>
     *
     * @param projectId 项目id
     * @return
     * @Author Zhu.yj
     * @createDate  2021/4/17
     */
    List<Map<String, Object>> getProjectRoleList(@Param("projectId") String projectId);

    /**
     * <desc>
     *      获取项目下的用户类型id和用户类型名称
     * </desc>
     *
     * @param projectId 项目id
     * @return
     * @Author Zhu.yj
     * @createDate  2021/5/14
     */
    List<Map<String, Object>> getProjectUserRoleList(@Param("projectId") String projectId);

    /**
     * <desc>
     *      根据房间号获取项目id
     * </desc>
     *
     * @param roomId 房间id
     * @return
     * @Author Zhu.yj
     * @createDate  2021/4/17
     */
    String getProjectByRoomId(@Param("roomId") String roomId);
}
